/**
 * 根据时间戳生成指定格式
 * @param {*Number} timestamp [时间戳	timestamp: 1659252290626]
 * @param {*String}	fmtString [需要转换的格式  YYYY/MM/DD hh:mm:ss]
 * @return {*String} [根据格式生成的时间]
 */
function formatTime(timestamp: number | Date | string = Date.now(), fmtString: string = 'YYYY-MM-DD hh:mm:ss') {
  // 1. 获取时间对象
  const data = timestamp ? new Date(timestamp) : new Date() // Wed Aug 24 2022 14:44:36 GMT+0800 (中国标准时间)

  // 2. 时间转换
  const dataO: Record<string, any> = {
    // 匹配 YYYY  =>  年份
    'Y+': data.getFullYear(),
    // 匹配 MM  =>  月份
    'M+': data.getMonth() + 1,
    // 匹配 DD  =>  日
    'D+': data.getDate(),
    // 匹配 hh  =>  时
    'h+': data.getHours(),
    // 匹配 mm  =>  分
    'm+': data.getMinutes(),
    // 匹配 ss  =>  秒
    's+': data.getSeconds(),
  }
  for (const key in dataO) {
    // 拿到对应的正则字符串
    const timeRegex = new RegExp(key, 'g')
    // 看是否需要匹配
    if (timeRegex.test(fmtString)) {
      // 小于两位数的，用 0 在前方补齐
      const value = (`${dataO[key]}`).padStart(2, '0')
      // 把匹配到的位置用数值来替换
      fmtString = fmtString.replace(timeRegex, value)
    }
  }
  return fmtString
}
/**
 * 延时
 * @description 进行延时，以达到可以简写代码的目的 比如: await sleep(20)将会阻塞20ms
 * @param {number} value 堵塞时间 单位ms 毫秒
 * @returns {Promise} 返回promise
 */
function sleep(value = 30) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(null)
    }, value)
  })
}

/** 获取间隔天数 */
function intervalDays(
  start: string | number | Date,
  end: string | number | Date,
) {
  let daysDiff = 0

  if (
    formatTime(start, 'YYYY/MM/DD')
    === formatTime(end, 'YYYY/MM/DD')
  ) {
    return daysDiff
  }
  const startDate = new Date(start)
  const endDate = new Date(end)
  // 将日期转换为毫秒数
  let timeDiff = Math.abs(
    startDate.getTime() - endDate.getTime(),
  )
  timeDiff = timeDiff / (1000 * 3600 * 24)
  // 将毫秒数转换为天数
  if (!startDate.getHours() || !endDate.getHours()) {
    daysDiff = Math.floor(timeDiff)
  }
  else {
    daysDiff = Math.ceil(timeDiff)
  }

  return daysDiff
}

function formatNumber(number: any) {
  return Number(number).toLocaleString()
}
function isEmpty(value: any) {
  return value === '' || value == null
}

export function defaultNumber(number: any, string = '-', useFormat = true) {
  number = isEmpty(number) ? string : number
  return (useFormat && number !== string) ? formatNumber(number) : number
}

export { formatTime, sleep, intervalDays }
